#include <iostream>
#include <mysql/mysql.h>

#define HOST "127.0.0.1"
#define USER "root"
#define PASSWD "sa1212@@"
#define DBNAME "test_db"

//添加数据
void add(MYSQL* mysql){
    const char* sql="insert into stu value(null,20,'zhangsan')";
    //执行sql语句
    int ret=mysql_query(mysql,sql);
    if(ret!=0){
        std::cerr<<mysql_error(mysql)<<std::endl;
    }
}

//删除数据
void del(MYSQL* mysql){
    const char* sql="delete from stu where name='zhangsan'";
    //执行sql语句
    int ret=mysql_query(mysql,sql);
    if(ret!=0){
        std::cerr<<mysql_error(mysql)<<std::endl;
    }
}

//修改数据
void mod(MYSQL* mysql){
    const char* sql="update stu set age=20 where name='zhangsan' ";
    //执行sql语句
    int ret=mysql_query(mysql,sql);
    if(ret!=0){
        std::cerr<<mysql_error(mysql)<<std::endl;
    }
}

void get(MYSQL* mysql){
    const char* sql=" select * from stu ";
    //执行sql语句
    int ret=mysql_query(mysql,sql);
    if(ret!=0){
        std::cerr<<mysql_error(mysql)<<std::endl;
        return;
    }
    // 保存查询结果到本地
    MYSQL_RES* res=mysql_store_result(mysql);
    if(res==nullptr){
        printf("mysql store result error:%s\n", mysql_error(mysql));
        return ;
    }
    //获取结果集的行数
    int row=mysql_num_rows(res);
    //获取结果集的列数
    int col=mysql_num_fields(res);
    //遍历结果集
    printf("%10s%10s%10s\n","id","age","name");
    for(int i=0;i<row;++i){
        MYSQL_ROW reslut=mysql_fetch_row(res);
        for(int j=0;j<col;++j){
            printf("%10s",reslut[j]);
        }
        std::cout<<std::endl;
    }
    //释放结果集
    mysql_free_result(res);
}

int main()
{
    //MySQL操作句柄初始化
    MYSQL* mysql=mysql_init(nullptr);
    if(mysql==nullptr){
        std::cerr<<"mysql_init fail"<<std::endl;
        return -1;
    }

    //连接MySQL服务器
    // 参数说明:
    // mysql--初始化完成的句柄
    // host---连接的mysql服务器的地址
    // user---连接的服务器的⽤⼾名
    // passwd-连接的服务器的密码
    // db ----默认选择的数据库名称
    // port---连接的服务器的端⼝： 默认0是3306端⼝
    // unix_socket---通信管道⽂件或者socket⽂件，通常置NULL
    // client_flag---客⼾端标志位，通常置0
    //MYSQL* mysql_real_connect(MYSQL* mysql, const char* host, const char* user,const char* passwd, 
    //const char* db, unsigned int port,const char* unix_socket, unsigned long client_flag)
    if(mysql_real_connect(mysql,HOST,USER,PASSWD,DBNAME,0,nullptr,0)==nullptr){
        std::cerr<<"mysql_real_connect fail!!!"<<std::endl;
        return 2;
    }
    // 设置当前客⼾端的字符集
    int ret=mysql_set_character_set(mysql, "utf8");
    if(ret!=0){
        std::cerr<<"mysql_set_character_set fail!!!"<<std::endl;
        return 3;
    }

    // add(mysql);
    // mod(mysql);
    // del(mysql);
    get(mysql);
    //关闭客户端连接
    mysql_close(mysql);
    return 0;
}